package kr.co.doriclassic.mypuppystory.infopuppy;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

import kr.co.doriclassic.mypuppystory.R;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.AssetManager;
import android.content.res.AssetManager.AssetInputStream;
import android.os.AsyncTask;
import android.os.Bundle;
import android.speech.RecognizerIntent;
import android.speech.SpeechRecognizer;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class Json_parserAcitivity extends Activity {
	ListView list;
	ProgressDialog progressDlg;
	private final int GOOGLE_STT = 1000;
	private final int MY_UI = 1001; // requestCode. 구글음성인식,
									// 내가 만든 Activity
	private ArrayList<String> mResult; // 음성인식 결과 저장할 list
	private String mSelectedString; // 결과 list 중 사용자가 선택한 텍스트
	private TextView mResultTextView;

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.network_jsonparser);
		list = (ListView) findViewById(R.id.listview);
		mResultTextView = (TextView) findViewById(R.id.result);
		new ParsingXml().execute("json/info.json");
	}

	private class ParsingXml extends AsyncTask<String, Void, ArrayList<Item>> {
		String search;

		public ParsingXml() {
			super();
		}

		public ParsingXml(String search) {
			this.search = search;
		}

		protected void onPreExecute() {
			progressDlg = ProgressDialog.show(Json_parserAcitivity.this,
					"Loading", "내용을 읽는 중입니다.");
		}

		protected void onPostExecute(final ArrayList<Item> result) {

			MyAdapter adapter = new MyAdapter(Json_parserAcitivity.this,
					R.layout.jsonrow, result);

			progressDlg.dismiss();
			list.setAdapter(adapter);
			list.setOnItemClickListener(new OnItemClickListener() {
				@Override
				public void onItemClick(AdapterView<?> parent, View view,
						int position, long id) {
					// Log.d("position", result.get(position).getText());
					Intent intent = new Intent(Json_parserAcitivity.this,
							IntentActivity.class);
					intent = intent.putExtra("sub", result.get(position)
							.getSub());
					intent = intent.putExtra("text", result.get(position)
							.getText());
					int res = getResources().getIdentifier(
							result.get(position)
									.getImg(), "drawable",
							"kr.co.doriclassic.mypuppystory");

					Log.d("res", res + "");
					intent = intent.putExtra("img", res);

					startActivity(intent);
				}
			});
		}

		protected ArrayList<Item> doInBackground(String... params) {
			AssetManager am = null;
			StringBuffer sb = null;
			BufferedReader br = null;
			AssetInputStream as = null;
			try {
				am = getResources().getAssets();
				as = (AssetInputStream) am.open(params[0]);
				br = new BufferedReader(new InputStreamReader(as));
				sb = new StringBuffer();

				int bufferSize = 1024 * 1024;
				char readBuf[] = new char[bufferSize];
				int resultSize = 0;

				while ((resultSize = br.read(readBuf)) != -1) {
					if (resultSize == bufferSize) {
						sb.append(readBuf);
					} else {
						for (int i = 0; i < resultSize; i++) {
							sb.append(readBuf[i]);
						}
					}
				}
			} catch (Exception e) {
				Toast.makeText(getApplicationContext(), "JSON Error",
						Toast.LENGTH_SHORT).show();
			} finally {
				try {
					br.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
				try {
					as.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			return parsingXml(sb.toString());
		}

		private ArrayList<Item> parsingXml(String xml) {
			ArrayList<Item> arItem = new ArrayList<Item>();
			Item itemClass;
			try {
				JSONArray ja = new JSONArray(xml);
				for (int i = 0; i < ja.length(); i++) {
					JSONObject itemObj = ja.getJSONObject(i);
					itemClass = new Item();
					if (search != null
							&& !itemObj.getString("sub").contains(search)) {
						continue;
					}
					itemClass.setSub(itemObj.getString("sub"));
					itemClass.setText(itemObj.getString("text"));
					itemClass.setImg(itemObj.getString("img"));

					arItem.add(itemClass);
				}
			} catch (JSONException e) {
				e.printStackTrace();
			}
			return arItem;
		}
	}

	// 음성서비스
	public void mOnClick(View v) throws IOException {
		switch (v.getId()) {
		case R.id.sttsearchbtn:
			Intent i = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
			i.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getPackageName());
			i.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "ko-KR");
			i.putExtra(RecognizerIntent.EXTRA_PROMPT, "검색어를 말하세요.");
			startActivityForResult(i, GOOGLE_STT);
			break;

		case R.id.txtsearchbtn:
			new ParsingXml(mResultTextView.getText().toString())
					.execute("json/info.json");
			break;
		}
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		if (resultCode == RESULT_OK
				&& (requestCode == GOOGLE_STT || requestCode == MY_UI)) { // 결과가
																			// 있으면
			showSelectDialog(requestCode, data); // 결과를 다이얼로그로 출력.
		} else { // 결과가 없으면 에러 메시지 출력
			String msg = null;

			// 내가 만든 activity에서 넘어오는 오류 코드를 분류
			switch (resultCode) {
			case SpeechRecognizer.ERROR_AUDIO:
				msg = "오디오 입력 중 오류가 발생했습니다.";
				break;
			case SpeechRecognizer.ERROR_CLIENT:
				msg = "단말에서 오류가 발생했습니다.";
				break;
			case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:
				msg = "권한이 없습니다.";
				break;
			case SpeechRecognizer.ERROR_NETWORK:
			case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:
				msg = "네트워크 오류가 발생했습니다.";
				break;
			case SpeechRecognizer.ERROR_NO_MATCH:
				msg = "일치하는 항목이 없습니다.";
				break;
			case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:
				msg = "음성인식 서비스가 과부하 되었습니다.";
				break;
			case SpeechRecognizer.ERROR_SERVER:
				msg = "서버에서 오류가 발생했습니다.";
				break;
			case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:
				msg = "입력이 없습니다.";
				break;
			}

			if (msg != null) // 오류 메시지가 null이 아니면 메시지 출력
				Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT)
						.show();
		}
	}

	// 결과 list 출력하는 다이얼로그 생성
	private void showSelectDialog(int requestCode, Intent data) {
		String key = "";
		if (requestCode == GOOGLE_STT) // 구글음성인식이면
			key = RecognizerIntent.EXTRA_RESULTS; // 키값 설정
		else if (requestCode == MY_UI) // 내가 만든 activity 이면
			key = SpeechRecognizer.RESULTS_RECOGNITION; // 키값 설정

		mResult = data.getStringArrayListExtra(key); // 인식된 데이터 list 받아옴.
		String[] result = new String[mResult.size()]; // 배열생성. 다이얼로그에서 출력하기 위해
		mResult.toArray(result); // list 배열로 변환

		// 1개 선택하는 다이얼로그 생성
		AlertDialog ad = new AlertDialog.Builder(this)
				.setTitle("선택하세요.")
				.setSingleChoiceItems(result, -1,
						new DialogInterface.OnClickListener() {
							@Override
							public void onClick(DialogInterface dialog,
									int which) {
								mSelectedString = mResult.get(which); // 선택하면 해당
																		// 글자 저장
							}
						})
				.setPositiveButton("확인", new DialogInterface.OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int which) {
						mResultTextView.setText(mSelectedString); // 확인
																	// 버튼
																	// 누르면
																	// 결과
																	// 출력
					}
				})
				.setNegativeButton("취소", new DialogInterface.OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int which) {
						mResultTextView.setText(""); // 취소버튼 누르면 초기화
						mSelectedString = null;
					}
				}).create();
		ad.show();
	}
}